<?php

// ------------------------------------------------------------------------
// |@Author       : Jarmin <topextend@qq.com>
// |@----------------------------------------------------------------------
// |@Date         : 2025-05-04 23:29:01
// |@----------------------------------------------------------------------
// |@LastEditTime : 2025-05-14 02:03:01
// |@----------------------------------------------------------------------
// |@LastEditors  : Jarmin <topextend@qq.com>
// |@----------------------------------------------------------------------
// |@Description  :
// |@----------------------------------------------------------------------
// |@FilePath     : Library.php
// |@----------------------------------------------------------------------
// |@Copyright (c) 2025 http://www.ladmin.cn All Rights Reserved.
// ------------------------------------------------------------------------
declare (strict_types=1);

namespace think\admin;

use think\Service;
use think\Request;
use think\Response;
use think\middleware\LoadLangPack;
use think\middleware\AllowCrossDomain;
use think\admin\service\SystemService;
use think\admin\middleware\LoadJwtAuth;
use think\admin\middleware\LoadMultiApp;
use think\admin\middleware\LoadRateLimit;
use think\admin\middleware\LoadApiVersion;
use think\admin\exception\ExceptionHandler;

/**
 * 模块注册服务
 * Class Library
 * @package think\admin
 */
class Library extends Service
{
    /**
     * 注册服务
     */
    public function register()
    {
        // 注册全局异常处理器
        $this->RegisterExceptionHandler();
        // 注册加载语言包
        $this->RegisterLangPack();
        // 注册系统配置
        $this->RegisterSystemConfig();
        // 注册API版本常量
        $this->RegisterApiVersion();
    }

    /**
     * 启动服务
     */
    public function boot()
    {
        // 请求初始化处理事件监听器注册
        $this->app->event->listen('HttpRun', function (Request $request) {
            // 注册多应用中间键
            $this->app->middleware->add(LoadMultiApp::class);
            // 注册语言包中间键
            $this->app->middleware->add(LoadLangPack::class);
            // 注册跨域中间键
            $this->app->middleware->add(AllowCrossDomain::class);
            // 注册API限流中间键
            $this->app->middleware->add(LoadRateLimit::class);
            // 注册JWT验证中间键
            // $this->app->middleware->add(LoadJwtAuth::class);
            // 注册API日志中间键
            // $this->app->middleware->add(LoadApiLog::class);
        });
    }

    /**
     * 注册全局异常处理器
     * @return void
     */
    protected function RegisterExceptionHandler(): void
    {
        $this->app->bind('think\exception\Handle', ExceptionHandler::class);
    }

    /**
     * 自动加载语言包文件
     * 功能说明：
     * 1. 遍历lang目录下的所有PHP文件
     * 2. 根据文件名自动识别语言代码
     * 3. 加载到ThinkPHP语言包系统中
     * 文件命名规范：
     * - 语言代码必须符合RFC 5646标准
     * - 文件名格式：{lang-code}.php（如：zh-cn.php）
     * @return void
     * @example 加载示例：
     * 文件路径：/lang/ja.php → 语言代码：ja
     */
    protected function RegisterLangPack(): void
    {
        $langPath = realpath(__DIR__ . DIRECTORY_SEPARATOR . 'lang');
        if ($langPath && is_dir($langPath)) {
            foreach (glob($langPath . DIRECTORY_SEPARATOR . '*.php') as $file) {
                if (is_file($file) && ($langCode = pathinfo($file, PATHINFO_FILENAME))) {
                    $this->app->lang->load($file, $langCode);
                }
            }
        }
    }

    /**
     * 注册系统配置
     * @return void
     */
    protected function RegisterSystemConfig(): void
    {
        $this->app->make(SystemService::class)->loadConfig();
    }

    /**
     * 注册API版本常量
     * 功能说明：
     * 1. 从请求参数或请求头中获取API版本号
     * 2. 定义API_VERSION常量，用于后续API版本控制
     * @return void
     */
    protected function RegisterApiVersion(): void
    {
        define('API_VERSION', request()->param('version') ?: request()->header('X-Api-Version') ?: 'v1');
    }
}
